#ifndef BUFFER_H
#define BUFFER_H

#include <cstring>   // perror
#include <iostream>
#include <vector>    // readv, vector
#include <atomic>    // atomic
#include <assert.h>  // assert
#include <string>    // string
#include <vector>
#include <atomic>
#include <unistd.h>
#include <sys/uio.h>
using namespace std;
// 创新点:利用临时的站上空间减少浪费
// 读写缓冲区
// readv: 

// 虽然用atmoic了 可是还是线程不安全的呀
// 因为涉及到copy等一系列操作了
// 以及乱序执行没有考虑到内存屏障
// 还有就是resize这个扩容操作
class Buffer
{
private:
    char* BeginPtr_();
    const char* BeginPtr_() const;
    void MakeSpace_(size_t len);
    vector<char> buffer_;
    atomic<std::size_t> readPos_;  // 修正：atmoic → atomic
    atomic<std::size_t> writePos_; // 修正：atmoic → atomic

public:
    // ...其他方法
    Buffer(int initBuffSize = 1024);
    ~Buffer() = default;

    size_t WritableBytes() const;       
    size_t ReadableBytes() const ;
    size_t PrependableBytes() const;

    const char* Peek() const;
    void EnsureWriteable(size_t len);
    void HasWritten(size_t len);

    void Retrieve(size_t len);
    void RetrieveUntil(const char* end);

    void RetrieveAll() ;
    std::string RetrieveAllToStr();

    const char* BeginWriteConst() const;
    char* BeginWrite();

    void Append(const std::string& str);
    void Append(const char* str, size_t len);
    void Append(const void* data, size_t len);
    void Append(const Buffer& buff);

    ssize_t ReadFd(int fd, int* Errno);
    ssize_t WriteFd(int fd, int* Errno);
};

#endif // BUFFER_H